public class Leetcode2 {
}
//leetcode:1004:最大连续1的个数III
//利用滑动窗口判断最多可以包含0的个数
class Solution1 {
    public int longestOnes(int[] nums, int k) {
        int zero = 0,n = nums.length,ret = 0;
        for(int left = 0,right = 0;right < n;right++){
            if(nums[right] == 0) zero++;//遇到0就让zero加1
            while(zero > k){//0的个数大于k就让left往后走，遇到0就让zero减1
                if(nums[left++] == 0) zero--;
            }
            ret = Math.max(ret,right-left+1);//得到最多可以包含0的个数的区间长度的最大值
        }
        return ret;
    }
}

//leetcode:1658:将x减到0的最小操作数
//变换思维：利用滑动窗口，从左边或右边（可以左右两边一起找）找和能等于x的最小数的长度，转换为找等于数组所有元素和sum-x的最长连续区间
class Solution2 {
    public int minOperations(int[] nums, int x) {
        int sum = 0,n = nums.length,ret = -1;
        //计算所有元素的和
        for(int a : nums){
            sum += a;
        }
        //得到sum-x
        int target = sum-x;
        //判断所有元素和比小就没有和等于x的数
        if(target < 0){
            return -1;
        }else if(target == 0){//如果等于0就代表整个数组就是和等于x的最小长度
            return n;
        }
        for(int left = 0,right = 0,tmp = 0;right < n;right++){
            tmp += nums[right];
            while(tmp > target){//如果数大于target就从左减小最长连续区间
                tmp -= nums[left++];
            }
            if(tmp == target){//如果tmp等于就找区间最长的赋值给ret
                ret = Math.max(ret ,right-left+1);
            }
        }
        return ret == -1 ? -1 : n-ret;//如果没有等于target的就返回-1，有返回n-ret得到和等于x的最小长度
    }
}